理智的我告訴自己,昨天的那段註解,只是一個好心系統管理員的備忘錄。
直到我發現 Connection-Saved.ps1──
放在一個沒上 ACL 的資料夾下。
不是編譯過的執行檔,而是一份完整、可讀、可執行的 PowerShell 腳本。
細看裡面,有他寫下來的一組流程:
# Connection-Saved.ps1
# Get-Credential | Export-Clixml -Path 'C:\scripts\pass.xml'
$encryptedPassword = Import-Clixml -Path 'C:\scripts\pass.xml'
$decryptedPassword = $encryptedPassword.GetNetworkCredential().Password
Connect-VIServer -Server 'VC-01' -User 'ctfboy_adm' -Password $decryptedPassword
乍看之下,這只是日常自動化。
但當我拿到 pass.xml,確認這是使用 Clixml 格式匯出的憑證,我的直覺告訴我:
「這不是給陌生人的東西。」
它只對特定的人──在同一個 SID、同一台主機、同一份 session ── 敞開。
我不確定這是不是巧合。
但我知道,有些東西 ...「選擇不刪除」比「不小心留下」還重要。
Clixml 透過 DPAPI 加密,限制了解密的使用者與機器。
我無法橫向移動用這段密碼,但若取得本機 admin、或是在原始帳號底下存取,就能還原出 plaintext。
$credential = Import-Clixml -Path 'C:\scripts\pass.xml'
$credential.GetNetworkCredential().username # ctfboy_adm
$credential.GetNetworkCredential().password # ReadMyM3mory!
這就是「從歷史紀錄裡打開後門」的下一步。
不是只看見過去,而是打開一個原本封閉的網路區段、一個未列出的資產管理介面──VC-01
。
這次,他沒有直接把帳號密碼寫進指令裡。
他用了 Clixml、用了腳本流程、用了原則。
或許不是留給我,
但剛好──
我找到了。
我在目標機器上潛行時,找到了一個沒有設定權限保護的資料夾,裡面有一個 PowerShell 腳本,叫做:
Connection-Saved.ps1
打開來一看,它不是亂寫的指令,而是寫好流程的自動化腳本。
仔細看腳本內容:
# Connection-Saved.ps1
# Get-Credential | Export-Clixml -Path 'C:\scripts\pass.xml'
$encryptedPassword = Import-Clixml -Path 'C:\scripts\pass.xml'
$decryptedPassword = $encryptedPassword.GetNetworkCredential().Password
Connect-VIServer -Server 'VC-01' -User 'ctfboy_adm' -Password $decryptedPassword
這段的意思很簡單:
系統管理員把登入用的帳密匯出成一個加密檔(pass.xml)
再從這個檔案抓出密碼,來自動連線到一台 vCenter 管理伺服器
他用的是 PowerShell 內建的加密方法,叫 Clixml + DPAPI。
這種加密有個重點:
只有「同一個使用者」在「同一台機器」上才能解密。
所以如果我剛好已經用他的帳號登入、或我有機器上的管理員權限,我就能直接把密碼解出來。
解釋我嘗試執行的指令:
PS C:\lab> $credential = Import-Clixml -Path 'C:\scripts\pass.xml'
PS C:\lab> $credential.GetNetworkCredential().username
ctf-boy
PS C:\lab> $credential.GetNetworkCredential().password
ReadMyM3mory!
這樣就成功還原出 vCenter 的管理員帳密
因為很多人以為把密碼加密、存在本機就安全了,但事實上,這種加密方式只要你拿到那台電腦的權限,或用同個帳號登入,你就能把整組密碼解出來。
這不只是設定問題,這是習慣問題。
PowerShell 憑證不要存本機:
改用安全的秘密管理工具(例如 Vault、Keepass)。
不要讓腳本跟密碼放在一起:
即使是自動化流程,也要區隔權限或加保護。
定期清除 PowerShell 歷史記錄:
用 Clear-History 或清掉 ConsoleHost_history.txt。
限制使用者對敏感資料夾的存取權限:
不要讓 Everyone 都能看 C:\scripts 這種目錄。
# 冷靜過後,我沒有想太多。
# 就是 Clixml、DPAPI、加密憑證、歷史紀錄、未設定 ACL 的資料夾,然後一組沒刪掉的 admin 密碼。
# 純屬正常流程!!!真的不是心動。